package cn.iocoder.yudao.module.scrm.util;

import cn.iocoder.yudao.framework.excel.core.strategy.DictTenantContext;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.scrm.controller.admin.clue.vo.ClueImportExcelVO;
import cn.iocoder.yudao.module.scrm.controller.admin.customer.vo.CustomerImportExcelVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import static cn.iocoder.yudao.module.scrm.enums.DictTypeConstants.*;

/**
 * 导入模板随机生成器类。
 * 该类提供了生成随机字典值、随机电话号码以及生成导出模板数据的方法。
 * @Author LiZhiMin
 * @Date 2024/5/21 16:20
 */
public class ImportTemplateRandomByTenant {

    /**
     * 从动态字典数据中随机获取一个字典值。
     *
     * @param dictType 字典类型，例如"CLUE_STATE"
     * @return 随机选取的字典值，如果字典值为空，则返回 null
     */
    public static String getRandomDictValue(String dictType) {
        // 获取当前租户 ID
        Long tenantId = TenantContextHolder.getTenantId();
        // 为当前租户创建字典上下文
        DictTenantContext tenantContext = new DictTenantContext(Math.toIntExact(tenantId));
        // 获取指定字典类型的字典值列表
        List<String> dictValues = tenantContext.getDictDataValueList(dictType);
        if (dictValues == null || dictValues.isEmpty()) {
            return null; // 或者返回一个默认值
        }
        // 随机选择一个字典值
        Random random = new Random();
        return dictValues.get(random.nextInt(dictValues.size()));
    }

    // 常量：随机数生成器
    private static final Random RANDOM = new Random();
    // 常量：手机号码前缀列表
    private static final String[] PREFIXES = {"130", "131", "132", "133", "134", "135", "136", "137", "138", "139", // 中国电信
            "150", "151", "152", "153", "155", "156", "157", "158", "159", // 中国联通
            "180", "181", "182", "183", "184", "185", "186", "187", "188", "189"}; // 中国移动

    /**
     * 生成一个随机的手机号码。
     *
     * @return 随机生成的手机号码
     */
    public static String generateRandomPhoneNumber() {
        // 随机选择一个前缀
        String prefix = PREFIXES[RANDOM.nextInt(PREFIXES.length)];
        // 生成后7位随机数字
        StringBuilder phoneNumber = new StringBuilder(prefix);
        for (int i = 0; i < 8; i++) {
            phoneNumber.append(RANDOM.nextInt(10));
        }
        return phoneNumber.toString();
    }

    /**
     * 根据租户生成随机的线索导入模板数据列表。
     *
     * @return 包含随机生成的 ClueImportExcelVO 对象的列表
     */
    public static List<ClueImportExcelVO> getClueImportTemplateRandomByTenant() {
        return Arrays.asList(ClueImportExcelVO.builder().name("张三").enterprise("阿里云有限公司").phone(generateRandomPhoneNumber()).clueState(getRandomDictValue(SCRM_CLUE_STATE_EXCEPT)).materialSource("素材来源咯").acquisitionTime(LocalDateTime.now()).clientSource(getRandomDictValue(SCRM_CLUE_CLIENT)).clientQuality(getRandomDictValue(SCRM_CLUE_IDEA)).clueSource("抖音广告").infoSource(getRandomDictValue(SCRM_CLUE_INFO)).remark("备注").build(),

                ClueImportExcelVO.builder().name("李四").enterprise("字节跳动有限公司").phone(generateRandomPhoneNumber()).clueState(getRandomDictValue(SCRM_CLUE_STATE_EXCEPT)).materialSource("素材来源咯").acquisitionTime(LocalDateTime.now()).clientSource(getRandomDictValue(SCRM_CLUE_CLIENT)).clientQuality(getRandomDictValue(SCRM_CLUE_IDEA)).clueSource("小红书广告").infoSource(getRandomDictValue(SCRM_CLUE_INFO)).remark("备注").build());
    }


    /**
     * 根据租户生成随机的客户导入模板数据列表。
     *
     * @return 包含随机生成的 ClueImportExcelVO 对象的列表
     */
    public static List<CustomerImportExcelVO> getCustomerImportTemplateRandomByTenants() {
        return Arrays.asList(CustomerImportExcelVO.builder()
                        .name("客户-张三")
                        .enterprise("阿里云有限公司")
                        .phone(generateRandomPhoneNumber())
                        .clueSource("线索来源")
                        .customerSourceTime(LocalDateTime.now())
                        .customerSource(getRandomDictValue(SCRM_CLUE_CLIENT))
                        .materialSource("素材来源咯")
                        .infoSource(getRandomDictValue(SCRM_CLUE_INFO))
                        .clientQuality(getRandomDictValue(SCRM_CLUE_IDEA))
                        .level(getRandomDictValue(SCRM_CUSTOMER_LEVEL))
                        .remark("备注")

                        .customerStage(getRandomDictValue(SCRM_CUSTOMER_STAGE))
                        .yearTurnover(getRandomDictValue(SCRM_YEAR_TURNOVER))
                        .sonCompany(getRandomDictValue(SCRM_SON_COMPANY))
                        .receivableMethod(getRandomDictValue(SCRM_PAYMENT_METHOD))
                        .summitStatus(getRandomDictValue(SCRM_SUMMIT_STATUS))
                        .position("职务")
                        .idCard("430121199001011234")
                        .inviter("邀约人")
                        .receivablePrice(new BigDecimal("66.66"))
                        .receivableTime(LocalDateTime.now())
                        .summitGroup("峰会组别")
                        .numberPeople("100人")
                        .quantityPain("需求痛点")
                        .build(),

                CustomerImportExcelVO.builder().name("客户-李四")
                        .enterprise("字节跳动有限公司")
                        .phone(generateRandomPhoneNumber())
                        .clueSource("线索来源22")
                        .customerSourceTime(LocalDateTime.now())
                        .customerSource(getRandomDictValue(SCRM_CLUE_CLIENT))
                        .materialSource("素材来源咯222")
                        .infoSource(getRandomDictValue(SCRM_CLUE_INFO))
                        .clientQuality(getRandomDictValue(SCRM_CLUE_IDEA))
                        .level(getRandomDictValue(SCRM_CUSTOMER_LEVEL))
                        .remark("备注")

                        .customerStage(getRandomDictValue(SCRM_CUSTOMER_STAGE))
                        .yearTurnover(getRandomDictValue(SCRM_YEAR_TURNOVER))
                        .sonCompany(getRandomDictValue(SCRM_SON_COMPANY))
                        .receivableMethod(getRandomDictValue(SCRM_PAYMENT_METHOD))
                        .summitStatus(getRandomDictValue(SCRM_SUMMIT_STATUS))
                        .position("职务")
                        .idCard("430122200001011234")
                        .inviter("邀约人")
                        .receivablePrice(new BigDecimal("66.66"))
                        .receivableTime(LocalDateTime.now())
                        .summitGroup("峰会组别")
                        .numberPeople("999人")
                        .quantityPain("需求痛点")
                        .build());
    }
}
